#include "tech_spec_lib.hpp"
#include "electric_motor.hpp"
#include "locomotives.hpp"
#include "railroad_car.hpp"
#include <map>
#include <string>
TechSpecificationLibrary::TechSpecificationLibrary() {
    this->electricMotorProperties["YJ85-A"] = new ElectricMotorProperty(
        "YJ85-A",                                // 名称
        ELECTRIC_MOTOR_TYPE::THREE_PHASED_ASYNC, // 类型
        1250,                                    // 最大功率 kW
        11852,                                   // 最大扭矩 N·m
        2662,                                    // 最大转速 rpm
        0.92,                                    // 效率
        4.85                                     // 减速比
    );
    this->railroadCarProperties["N6"] =
        new RailroadCarProperty("N6",                      // 名称
                                RailroadCarType::FLAT_CAR, // 类型
                                12.5,                      // 长度
                                100,                       // 设计速度
                                21.5,                      // 重量
                                60                         // 最大载重
        );
    this->locomotiveProperties["HXD3C"] = new LocomotiveProperty(
        "HXD3C",                                   // 型号名称
        LOCOMOTIVE_TYPE::LOCOMOTIVE_TYPE_ELECTRIC, // 类型
        2.0,                                       // 轮子直径
        138.0,                                     // 基本质量
        6,                                         // 驱动轴数量
        6,                                         // 总轴数
        6,                                         // 电机数量
        this->electricMotorProperties["YJ85-A"],   // 电机属性
        20,                                        // 启动速度：20km/h
        20.846                                     // 长度20.846m
    );
}

ElectricMotorProperty *
TechSpecificationLibrary::getElectricMotorProperty(std::string motorName) {
    // 从map中获取motorName对应的电机属性，如果不存在则返回空指针
    return this->electricMotorProperties.find(motorName) !=
                   this->electricMotorProperties.end()
               ? this->electricMotorProperties[motorName]
               : nullptr;
}

RailroadCarProperty *
TechSpecificationLibrary::getRailroadCarProperty(std::string carName) {
    // 从map中获取carName对应的车厢属性，如果不存在则返回空指针
    return this->railroadCarProperties.find(carName) !=
                   this->railroadCarProperties.end()
               ? this->railroadCarProperties[carName]
               : nullptr;
}

LocomotiveProperty *
TechSpecificationLibrary::getLocomotiveProperty(std::string locomotiveName) {
    return this->locomotiveProperties.find(locomotiveName) !=
                   this->locomotiveProperties.end()
               ? this->locomotiveProperties[locomotiveName]
               : nullptr;
}
